home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
asmutil
/
asm_n_z.zip
/
START.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-06-02
|
24KB
|
938 lines
PAGE ,80
;
TITLE * START.ASM *
SUBTTL Program to start processes at a predetermined time.
;
; CREATED 06-DEC-85 :RICHARD B JOHNSON
;
IF1
%OUT [PASS1]
ELSE
%OUT [PASS2]
ENDIF
;
; Misc equates.
;
CR EQU 0DH
LF EQU 0AH
MS_DOS EQU 21H ;SYSTEM
CLK EQU 1CH ;TIMER VECTOR
CLX EQU 08H ;BEGINNING OF TIMER VECTOR
INT_BASE EQU 20H ;INTERRUPT CONTROLLER
VID_ROM EQU 10H ;VIDEO ROM
K EQU 1024
K16 EQU 16 * K
CMD_BUF EQU 80H ;COMMAND LINE
RAM EQU 12H ;GET AVAILABLE RAM
MAX_HRS EQU 23
MAX_MIN EQU 59
MAX_SEC EQU MAX_MIN
EQUIP EQU 410H ;EQUIPMENT FLAG
BWSEG EQU 0B000H ;SEGMENT FOR BLACK/WHITR
COSEG EQU 0B800H ;SEGMENT FOR COLOR
;
;
PSEG SEGMENT
ASSUME CS:PSEG,SS:PSEG,DS:PSEG,ES:NOTHING
ORG 100H
MAIN PROC NEAR
JMP INIT
DB 'Copyright (C) 1985 Richard B. Johnson. '
DB 'All rights reserved. '
PRP0 DB CR,LF,'Process $'
PRP1 DB CR,LF,'will start at '
HH DB '00:'
MM DB '00:'
SX DB '00. If not correct, hit any key.... $'
PRP2 DB ' aborted.',CR,LF,'$'
PRP3 DB ' loaded.',CR,LF,'$'
PRP4 DB CR,LF,'Usage:'
DB CR,LF,'START HH:MM:SS \PATH\RUNFILE COMMAND STRING'
DB CR,LF,LF,'Examples:'
DB CR,LF,'START 23:55:00 C:\DOS\BACKUP.BAT TODAYS FILES'
DB CR,LF,'START 12:00:00 \SETCLOCK'
DB CR,LF,'START 15:00:00 COPY *.DAT E:'
DB CR,LF,'$'
PRP5: DB CR,LF,'The time entered must be LATER than the present '
DB 'time!',CR,LF,'$'
;
BEEP DB 7,'Your process will resume in a moment.'
DB CR,LF,'$'
;
ERRW DB CR,LF,'Not enough disk space to save the screen'
DB CR,LF,'(need 16k).$'
;
FILE1 DB '\SCREEN.TMP',0
FILEN EQU $ - FILE1
FILE2 DB ' ',0
HANDLE DW ?
;
CNT DB 182 ;LOCAL CLOCK TICK COUNT
SEC DB ? ;LOCAL CLOCK SECONDS
MIN DB ? ;LOCAL CLOCK MINUTES
HRS DB ? ;LOCAL CLOCK HOURS
SAV_SEC DB ? ;COMMAND STRING SECS (BINARY)
SAV_MIN DB ? ;COMMAND STRING MINS (BINARY)
SAV_HRS DB ? ;COMMAND STRING HRS (BINARY)
SS_SAV DW ? ;USER'S STACK SEGMENT
SP_SAV DW ? ;USER'S STACK POINTER
COMMAND DB '\COMMAND.COM',0
;
BLOCK DW 0 ;PARAMETER BLOCK FOR EXEC
DW CMD_BUF ;DEFALUT BUFFER
BP_1 DW ? ;CS WRITTEN HERE
DW 5CH ;DEFAULT FCB
BP_2 DW ? ;CS WRITTEN HERE
DW 6CH ;OTHER FCB
BP_3 DW ? ;CS WRITTEN HERE
;
DTA_SEG DW ? ;USER'S DTA (SEGMENT)
DTA_OFF DW ? ;USER'S DTA (OFFSET)
SSP_SAV DW ? ;OUR STACK POINTER
SAV_SEG DW ? ;OLD INTERRUPT SEGMENT
SAV_OFF DW ? ;OLD INTERRUPT OFFSET
CUR_SAV DW ? ;CURSOR SAVE
CUR_TYP DW ? ;CURSOR TYPE
CUR_PGE DB ? ;CURRENT PAGE
OLD_CLK LABEL DWORD ;OLD TIMER VECTOR
IP_CLK DW ? ;IP FOR OLD CLOCK
CS_CLK DW ? ;CS FOR OLD CLOCK
OLD_CLX LABEL DWORD ;START OF CLOCK VECT
IP_CLX DW ? ;IP FOR START
CS_CLX DW ? ;CS FOR START
CRT_FLG LABEL DWORD ;CRITICAL FLAG (DOS)
DOS_FLG DW ? ;CRITICAL FLAG ADDRESS
DW ?
SEGMNT DW ? ;VIDEO SEGMENT
HERE DB 0 ;REENTRY FLAG
DISK DB ? ;CURRENT DISK
DIRZ DB '\'
DIRECT DB 64 DUP (?) ;CURRENT DIRECTORY
;
INFORM DB ' /C '
BUFFER DB ' ' ;THE SPACE
ASC_HRS DB 'HH:' ;HOURS IN ASCII
ASC_MIN DB 'MM:' ;MINUTES IN ASCII
NEW_CMD EQU $ - 2 ;NEW COMMAND LINE
NEW_TXT EQU NEW_CMD + 1 ;WHERE TEXT STARTS
ASC_SEC DB 'SS' ;SECONDS IN ASCII
DELIM DB ' ' ;NORMAL SPACE
DB 64 DUP (?) ;REST OF COMMAND LINE
LINE DB CR,LF,'Batch '
TIME DB '00:00:00 '
DATE DB '00-JAN-00 '
LEN EQU $ - LINE
LINEBUF DB 64 DUP (0)
MONTH DB 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'
LOGF DB '\BATCH.LOG',0 ;PROCESS LOG FILE
LOGCHAN DW ?
BYTES DW ?
;
EVEN
DB 32 DUP ('STACK ')
STK_TOP LABEL WORD
;
INIT: MOV AX,CS
MOV WORD PTR [BP_1],AX ;FOR 'LOAD AND EXECUTE'
MOV WORD PTR [BP_2],AX
MOV WORD PTR [BP_3],AX
CALL SET_TIM ;SET PRIVATE TIME
;
; Check for graphics board
;
PUSH DS ;SAVE DATA SEG
XOR AX,AX ;ZERO IT
MOV DS,AX
MOV AL,BYTE PTR DS:[EQUIP] ;GET EQUIPMENT FLAG
POP DS ;RESTORE DATA SEGMENT
AND AL,00110000B ;MASK TRASH
MOV WORD PTR [SEGMNT],BWSEG ;ASSUME SEGMENT FOR B/W
CMP AL,00110000B ;IS IT BLACK AND WHITE?
JZ SEG_OK ;YES
MOV WORD PTR [SEGMNT],COSEG ;MUST BE COLOR
;
SEG_OK: CALL PARSE ;PARSE COMMAND LINE
JC FINIS ;BAD COMMAND LINE
CALL GET_FLAG ;SET UP CRITICAL PROCESS FLAG
CALL SET_INT ;SET UP INTERRUPTS
CALL SET_TIM ;SET TIME AGAIN
CALL KEEP3K
KEEP: MOV AX,3100H ;KEEP PROCESS FUNCTION
INT MS_DOS
HLT ;IN CASE SOMETHING'S BUSTED
FINIS: MOV AX,4C00H ;TERMINATE PROCESS
INT MS_DOS
MAIN ENDP
;
CLK_INT PROC FAR
ASSUME CS:PSEG,SS:PSEG,DS:PSEG,ES:NOTHING
PUSH AX ;SAVE
PUSH DS ;AND DS
PUSH CS ;COPY CODE SEGMENT
POP DS ;INTO DATA SEG
;
; We get interupted 18.2 times per second.
; Routine below produces 1 second 'Ticks' by
; dividing by 18.2 (honest). Subtracts 10 from 182
; each interupt and adds the remainder to 182 for
; the next run through the loop. Result is an AVERAGE
; division by 18.2.
CMP BYTE PTR [CNT],0FFH ;FLAG SHOWS THAT WE TIMED OUT
JZ BYPASS ;ALREADY TIMED OUT
SUB BYTE PTR [CNT],10 ;RUNNING COUNT
JNC BYPASS ;NO CARRY YET
ADD BYTE PTR [CNT],182 ;CUTE EH?
;
; Simple 24 hour clock counter follows.
;
INC BYTE PTR [SEC] ;BUMP SECONDS COUNTER
CMP BYTE PTR [SEC],60 ;ARE WE THERE YET?
JNZ TIM_OK ;NOPE
MOV BYTE PTR [SEC],0 ;YES, ZERO SECONDS AND ....
INC BYTE PTR [MIN] ;BUMP MINUTES
CMP BYTE PTR [MIN],60 ;ARE WE THERE YET?
JNZ TIM_OK ;NOPE
MOV BYTE PTR [MIN],0 ;YES, ZERO MINUTES AND.... ETC
INC BYTE PTR [HRS]
CMP BYTE PTR [HRS],24
JNZ TIM_OK
MOV BYTE PTR [HRS],0
;
; Check new time against saved time from command line.
;
TIM_OK: MOV AL,BYTE PTR [HRS] ;GET HOURS
CMP AL,BYTE PTR [SAV_HRS] ;SAME AS SAVED?
JNZ BYPASS ;NO
MOV AL,BYTE PTR [MIN] ;GET MINUTES
CMP AL,BYTE PTR [SAV_MIN] ;SAME AS SAVED?
JNZ BYPASS ;NO
MOV AL,BYTE PTR [SEC] ;GET SECONDS
CMP AL,BYTE PTR [SAV_SEC] ;SAME AS SAVED?
JNZ BYPASS ;NO
MOV BYTE PTR [CNT],0FFH ;SET FLAG (WE ARE TIMED OUT)
BYPASS: POP DS ;OLD DATA SEG
POP AX ;AND AX
JMP DWORD PTR CS:[OLD_CLK] ;CHAIN TO NEXT (IF ANY)
CLK_INT ENDP
;
; This is the second clock interrupt vector.
;
CLX_INT PROC FAR
CMP BYTE PTR CS:[HERE],0 ;SEE IF REENTRY IS OCCURING
JNZ HOME ;YES, DON'T ALLOW REENTRY
CMP BYTE PTR CS:[CNT],0FFH ;SEE IF WE TIMED OUT
JNZ HOME ;NO, NOT YET
;
; Check to see if we interrupted something important.
;
PUSH BX
PUSH DS
LDS BX,DWORD PTR CS:[CRT_FLG] ;GET CRITICAL FLAG
CMP BYTE PTR DS:[BX],0
POP DS
POP BX
JZ TIMOUT ;OK TO MAKE DOS CALLS
;
DONE: MOV BYTE PTR CS:[HERE],0 ;RESTORE REENTRY FLAG
HOME: JMP DWORD PTR CS:[OLD_CLX] ;CONTINUE
;
; Coast is clear, save stack and continue.
;
TIMOUT: MOV BYTE PTR CS:[HERE],0FFH ;SET ENTRY FLAG
PUSH AX ;SAVE USER'S
PUSH DS ;AND DS
PUSH CS ;COPY CODE SEGMENT
POP DS ;INTO DATA SEG
CLI
MOV WORD PTR [SS_SAV],SS ;SAVE IT
MOV WORD PTR [SP_SAV],SP ;SAVE STACK POINTER
MOV AX,CS ;GET CODE SEG
MOV SS,AX ;INTO STACK SEG
MOV SP,OFFSET STK_TOP ;LOCAL STACK
;
PUSH BX ;SAVE EVERYTHING IN LOCAL STACK
PUSH CX
PUSH DX
PUSH DI
PUSH SI
PUSH BP
PUSH ES
MOV ES,AX ;CODE SEGMENT INTO EXTRA SEG
;
; Run the program
;
CODE PROC NEAR
CALL RES_INT ;RESTORE OLD INTERRUPT VECTORS
STI ;OK TO INTERRUPT
CALL RES_HRD ;RESET HARDWARE CONTROLLER
CALL SAV_SCR ;SAVE THE USER'S SCREEN
CALL TELL ;TELL USER WHAT WE'RE DOING
CALL LOG ;LOG TO DISK
CALL SAV_DIR ;SAVE CURRENT DIRECTORY
CALL SAV_DTA ;SAVE USERS DATA AREA
CALL SET_DTA ;SET UP LOCAL DATA AREA
CALL GET_MEM ;GET MORE MEMORY (dummy)
JC NOFREE ;NOTHING AVAILABLE
MOV ES,AX ;NEW SEGMENT ADDRESS OF AVAILABLE MEM
NOFREE: CALL KEEP3K ;RESTORE TO POOL
CALL RUN_PG ;LOAD/EXECUTE COMMAND.COM
CALL RES_DTA ;RESTORE USERS DATA TRANSFER AREA
CALL RES_DIR ;RESTORE CURRENT DIRECTORY
CALL RES_SCR ;RESTORE USER'S SCREEN
CALL KEEP0K ;GIVE UP ALL MEMORY
CODE ENDP
;
; Return to user program.
;
POP ES ;RESTORE USER'S REGISTERS
POP BP ;SAVED IN LOCAL STACK
POP SI
POP DI
POP DX
POP CX
POP BX
;
CLI
MOV SS,WORD PTR [SS_SAV] ;GET SAVED STACK SEG
MOV SP,WORD PTR [SP_SAV] ;GET OLD STACK POINTER
POP DS ;RESTORE R